package com.fengwk.cv4j.compute.num;

import com.fengwk.cv4j.compute.Compute;
import com.fengwk.support.util.MathUtils;

public class NumCompute implements Compute<Number> {

	@Override
	public Number add(Number t1, Number t2) {
		return t1.doubleValue() + t2.doubleValue();
	}

	@Override
	public Number sub(Number t1, Number t2) {
		return t1.doubleValue() - t2.doubleValue();
	}

	@Override
	public Number mul(Number t1, Number t2) {
		return t1.doubleValue() * t2.doubleValue();
	}

	@Override
	public Number div(Number t1, Number t2) {
		return t1.doubleValue() / t2.doubleValue();
	}

	@Override
	public Number pow(Number t1, Number t2) {
		return  Math.pow(t1.doubleValue(), t2.doubleValue());
	}

	@Override
	public Number exp(Number t) {
		return Math.exp(t.doubleValue());
	}

	@Override
	public Number log(Number t) {
		return Math.log(t.doubleValue());
	}

	@Override
	public Number neg(Number t) {
		return - t.doubleValue();
	}

	@Override
    public Number mean(Number...ts) {
        return MathUtils.mean(ts);
    }

    @Override
    public Number sum(Number...ts) {
        return MathUtils.sum(ts);
    }
	
    @Override
    public Number mod(Number t1, Number t2) {
        return t1.doubleValue() % t2.doubleValue();
    }

    @Override
    public Number abs(Number t) {
        return Math.abs(t.doubleValue());
    }

    @Override
    public Number sign(Number t) {
        double d = t.doubleValue();
        if (d > 0)
            return 1;
        else if (d < 0)
            return -1;
        else
            return 0;
    }

    @Override
    public Number cos(Number t) {
        return Math.cos(t.doubleValue());
    }

    @Override
    public Number sin(Number t) {
        return Math.sin(t.doubleValue());
    }

    @Override
    public Number tan(Number t) {
        return Math.tan(t.doubleValue());
    }

    @Override
    public Number atan(Number t) {
        return Math.atan(t.doubleValue());
    }

    @Override
    public Number round(Number t) {
        return Math.round(t.doubleValue());
    }

    @Override
    public Number floor(Number t) {
        return Math.floor(t.doubleValue());
    }

    @Override
    public Number ceil(Number t) {
        return Math.ceil(t.doubleValue());
    }
    
    public Number max(Number...ts) {
        return MathUtils.maxNum(ts);
    }

    public Number min(Number... ts) {
        return MathUtils.minNum(ts);
    }

    @Override
    public Number equals(Number t1, Number t2) {
        return t1.doubleValue() == t2.doubleValue() ? 1 : 0;
    }

}
